package com.design.pattern.proxy.sub;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * 通过CGLIB实现子类代理,
 * 其步骤不算复杂,首先我们需要指定被代理类即target,然后通过加强器来加强该类,然后设置加强方法的代理类,最后通过加强器创建出代理对象.
 * 具体实现可以看构造方法.
 */
public class CglibProxy<T> implements MethodInterceptor {
    public CglibProxy(T target){
        this.target=target;//通过构造注入被代理对象
    }
    public T getProxy(){
        Enhancer enhancer=new Enhancer();//创建加强器
        enhancer.setSuperclass(this.target.getClass());//指定被代理的类
        enhancer.setCallback(this);//设置代理类
        return (T)enhancer.create();//返回代理实例
    }
    private T target;

    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("准备");
        Object result=methodProxy.invokeSuper(o,objects);
        System.out.println("收尾");
        return result;
    }
}
